package org.study.fastmybatis.boot.mapper;

import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * SQL分类：
 * 1、DDL(Data Definition Language)数据定义语言，用来操作数据库、表、列等；常用语句：CREATE、ALTER、DROP
 * 2、DML(Data Manipulation Language)数据操作语言，用来操作数据库中表里的数据；常用语句：INSERT、UPDATE、DELETE
 * 3、DCL(Data Control Language)数据控制语言，用来操作访问权限和安全级别；常用语句：GRANT、DENY
 * 4、DQL(Data Query Language)数据查询语言，用来查询数据；常用语句：SELECT
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2025年11月20日
 */
public interface DbmMapper {
    /**
     * 查询当前使用的数据库名称：select database()
     */
    String selectDatabase();

    /**
     * 查看当前所有数据库：show databases
     */
    List<String> showDatabases();

    /**
     * 查看表结构：show create table 表名称
     */
    List<Map<String, String>> descDatabase(@Param("dbName") String dbName);

    /**
     * 创建一个数据库：CREATE DATABASE [IF NOT EXISTS] 数据库名称;
     */
    int createDatabase(@Param("dbName") String dbName);

    /**
     * 删除一个数据库：DROP DATABASE [if EXISTS] 数据库名称;
     */
    int dropDatabase(@Param("dbName") String dbName);

    /**
     * 查看数据库中的所有表：show tables
     */
    List<String> showTables();

    /**
     * 查看表结构：SELECT * FROM information_schema.TABLES WHERE table_schema = '库名称'
     */
    List<Map<String, String>> selectTableList(@Param("dbName") String dbName);

    /**
     * 查看表结构：show create table 表名称
     */
    List<Map<String, String>> descTable1(@Param("tableName") String tableName);

    /**
     * 查看表结构：describe/desc 表名称
     */
    List<Map<String, String>> descTable2(@Param("tableName") String tableName);

    /**
     * 查看表结构：show columns from 表名称
     */
    List<Map<String, String>> descTable3(@Param("tableName") String tableName);

    /**
     * 查看表结构：SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '库名称' AND TABLE_NAME = '表名称'
     */
    List<Map<String, String>> descTable4(@Param("dbName") String dbName, @Param("tableName") String tableName);

    /**
     * 创建表：
     * <pre>
     *  CREATE TABLE IF NOT EXISTS `表名称`(
     *    '字段名' 列类型 [属性] [索引] [注释],
     *    '字段名' 列类型 [属性] [索引] [注释],
     *    ......
     *    '字段名' 列类型 [属性] [索引] [注释]
     *  )[表的类型][字符集设置][注释]
     * </pre>
     */
    int createTable(@Param("createTableSql") String createTableSql);

    /**
     * 清空表内容：truncate table 表名称;
     */
    int truncateTable(@Param("tableName") String tableName);

    /**
     * 删除表：DROP TABLE [IF EXISTS] 表名称
     */
    int dropTable(@Param("tableName") String tableName);

    /**
     * 修改表名：alter table 原表名称 rename to 新表名称;
     */
    int renameTableName1(@Param("srcTableName") String srcTableName, @Param("desTableName") String desTableName);

    /**
     * 修改表名：alter table 原表名称 rename as 新表名称;
     */
    int renameTableName2(@Param("srcTableName") String srcTableName, @Param("desTableName") String desTableName);


    /**
     * 添加列：alter table 表名称 add [column] 列名 类型;
     * <p>
     * 使用FIRST将新字段添加在表第一个位置：alter table 表名称 add [column] 列名 类型 FIRST;
     * 使用BEFORE将新字段添加在某个字段之前：alter table 表名称 add [column] 列名 类型 BEFORE 列名;
     * 使用AFTER将新字段添加在某个字段之后：alter table 表名称 add [column] 列名 类型 AFTER 列名;
     * 指定字段的默认值为当前时间：`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     * 修改表中数据时，自动更新指定字段值为当前时间：`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
     */
    int addTableColumn(@Param("tableName") String tableName, @Param("columnName") String columnName);

    /**
     * 修改列长度：alter table 表名称 modify [column] 列名称 新数据类型;
     * 区别：modify可以修改字段的长度和默认值，change在modify的基础上还可以修改字段的名称(即重命名字段)
     */
    int modifyTableColumn(@Param("tableName") String tableName, @Param("columnName") String columnName);

    /**
     * 修改列名称： alter table 表名称 change 原列名称 新列名称 新数据类型;
     * 区别：modify可以修改字段的长度和默认值，change在modify的基础上还可以修改字段的名称(即重命名字段)
     */
    int changeTableColumnName(@Param("tableName") String tableName, @Param("srcColumnName") String srcColumnName, @Param("desColumnName") String desColumnName);

    /**
     * 删除列：alter table 表名 drop [column] 列名;
     */
    int dropTableColumn(@Param("tableName") String tableName, @Param("columnName") String columnName);


}
